PowerShell Core 6.2 新機能・破壊的変更まとめ
しばたです。
先日リリースされたPowerShell Core 6.2の新機能および破壊的変更に関するドキュメントが更新されたのでいつも通り簡単に解説していきます。
(過去バージョンのPowerShell Coreについてはクラスメソッド入社前に個人ブログでまとめています。(6.1新機能、6.0新機能、6.0破壊的変更))
今回はPowerShell Teamも忙しかったのかドキュメントの構成がかなり雑で「機能修正と言いってるけどそれ新機能でしょ?」といった感じの修正がそこそこあります...
残念ながら元のドキュメントがあまり整理されていないのですが本記事もこの構成に従う形で進めていきます。
PowerShell Core 6.2 新機能
PowerShell Core 6.2では以下の新機能が導入されています。
Experimental Features
PowerShell Core 6.2から新規に導入された試験的な機能(Experimental Feature)については以前にDevelopers.IOで記事にしていますのでこちらをご覧ください。
破壊的変更
PowerShell Core 6.2では以下の破壊的変更が加えられています。
Fix -NoEnumerate behavior in Write-Output to be consistent with Windows PowerShell. (#9069)
こちらはちょっと問題の経緯がややこしいのですが、PowerShell Coreのどこかの修正(#2038とされている)で、Write-Output -NoEnumerate
を指定した際の挙動が期待した動作にならない問題がありました。(#5955)
# 期待される挙動 (Windows PowerShellの挙動でもある)
C:\> (Write-Output -NoEnumerate 1, 2).GetType().Name
Object[]
C:\> (Write-Output -NoEnumerate ([System.Collections.ArrayList] (1, 2))).GetType().Name
ArrayList
# PowerSHell Core 6.0 - 6.1の挙動
C:\> (Write-Output -NoEnumerate 1, 2).GetType().Name
PSObject[]
C:\> (Write-Output -NoEnumerate ([System.Collections.ArrayList] (1, 2))).GetType().Name
PSObject[]
この挙動を改善するためにWrite-Output
の-InputObject
パラメーターの型をPSObject[]
からPSObject
に変更しています。
Add -Stable to Sort-Object and related tests (#7862)
Sort-Object
に安定ソートを行うための-Stable
パラメーターが追加されました。
Improve Start-Sleep cmdlet to accept fractional seconds (#8537)
Start-Sleep
の-Seconds
パラメーターの型がint
からdouble
に変わり小数値を受け入れることができる様になりました。
Change hashtable to use OrdinalIgnoreCase to be case-insensitive in all Cultures
Linux環境でLANG環境変数にC.UTF-8
(InvariantCultureなコード)を指定された場合にハッシュテーブルのプロパティ参照で大文字・小文字が区別されてしまう問題(#7761)があり、これに対応するためにカルチャに依存しない方式(OrdinalIgnoreCase)で大文字・小文字の区別をしない様にする修正を施しています。
Fix LiteralPath in Import-Csv to bind to Get-ChildItem output (#8277)
Get-ChildItem | Import-Csv
といったコマンドを実行可能にするためにImport-Csv
の-LiteralPath
パラメーターの挙動を変更しています。
No longer skips a column without name if double quote delimiter is used in Import-Csv (#7899)
デリミタにダブルクオート("
)が指定されており、ヘッダ行に空文字となる列がある場合にその列が一切インポートされない不具合(#7110)に対する修正が入っています。
Debug parameter now sets $DebugPreference to Continue instead of Inquire (#8195)
-Debug
パラメーターの挙動に対するこちらの提案(#7122)の内容を受けて、-Debug
パラメーターが指定された際の$DebugPreference
の既定値をInquire
からContinue
に変更しています。
細かい話は上記提案およびPull Requestをご覧ください。
Honor -OutputFormat if specified in non-interactive, redirected, encoded command used with pwsh (#8115)
pwsh(.exe)
の引数で-NonInteractive
と-OutputFormat
を併用した際に指定した-OutputFormat
にならない不具合が解消されています。
(こちら手元の環境で状況再現をしようとしたのですがうまくいきませんでした...)
Load assembly from module base path before trying to load from the GAC (#8073)
バイナリモジュールで参照するアセンブリがBasePathおよびGACにある場合にGACにあるアセンブリを先読みしてしまう問題を解消し、BasePathにあるアセンブリを先にロードする様に修正されています。
Remove tilde from Linux preview packages (#8244)
Linuxパッケージ名のバージョン区切りに含まれる~
の使用を廃止する修正が入っています。
バージョンのフォーマットが major.minor.patch[~previewName[Number]]
から major.minor.patch[-previewName[Number]]
に変更されています。
Move processing of -WorkingDirectory before processing of profiles (#8079)
pwsh(.exe)
の-WorkingDirectory
パラメーターの指定が反映されるタイミングをプロファイルの実行後から実行前に変更しています。
Do not add PATHEXT environment variable on Unix (#7697)
非Windows環境ではPATHEXT
環境変数を追加しない様になりました。
既知の問題
Remoting on Windows IOT ARM platforms has an issue loading modules. See (#8053)
こちらはタイトルにある通り#8053をご覧ください。
PowerShell Core on Windows IOT ARM32 on Raspberry Piな環境にEnter-PSSession
で接続できない不具合だそうです。
プログラム修正など
以下各種バグフィックスなどの修正について解説していきます。
最初に触れた通り「どう見ても新機能でしょコレ?」といった修正もあります。
Enable case-insensitive tab completion for files and folders on case-sensitive filesystem (#8128)
Linuxなど大文字・小文字を区別するファイルシステム上でのタブ補完によるファイル・ディレクトリ名の列挙が大文字・小文字を区別しない様になりました。
こちらはIssueとしてはかなり昔からあったのですが、.NET Core 2.1での機能追加によりやっと対応できた模様です。
Make PSVersionInfo.PSVersion and PSVersionInfo.PSEdition public (#8054)
バイナリモジュール開発者向けにPSVersionInfo
クラスとPSEdition
プロパティのアクセシビリティがinternal
からpublic
に変更されました。
Add Type Inference for $_ / $PSItem in catch{ } blocks (#8020)
これは地味に嬉しい改善で、catch{ }
ブロック内で使う$_
自動変数で型推論ができる様になりました。
内部的にはErrorRecord<TException>
型として扱う様にしてタブ補完等できる様にしています。
Fix static method invocation type inference (#8018)
クラスの静的メソッドの結果に対する型推論が改善されています。
私も細かいところを把握できていないため、詳細は元のプルリクエスト(#8018)をご覧ください。
ざっと試した感じ、
[powershell]::Create().<Tab入力>
の様な補完が利く様になっていました。
Create inferred types for Select-Object, Group-Object, PSObject and Hashtable (#7231)
Select-Object
やGroup-Object
でPSCustomObjectやHashtableのプロパティを推論できる様にするためにPSInferredProperty
という内部プロパティを追加しています。
この対応により、例えば、
@{ Name = "Staffan"; Size = 3 } | Select-Object -Property <Tab入力>
といった入力をした際にHashtableのプロパティ(Name
やSize
)が補完できる様になっています。
Support calling method with ByRef-like type parameters (#7721)
ByRef-likeな型(Span
やReadOnlySpan
など)を引数に持つメソッドの実行に対応しています。
# .NET CoreではIsPathRootedはSystem.ReadOnlySpan[char]が引数になるものがある
# * static bool IsPathRooted(System.ReadOnlySpan[char] path)
#
# 上記対応によりこの様な呼び出しが正しく動作する
$charArray = "F:\".ToCharArray()
[System.IO.Path]::IsPathRooted($charArray)
Handle the case where the Windows PowerShell module path is already in the environment's PSModulePath (#7727)
こちらはWindows環境においてPSModulePath
環境変数に設定されるパスの順序をPowerShell Coreを優先させる変更となります。
元々の問題(#7679)として、PowerShell CoreからWindows PowerShell環境にリモート接続した際にWindows PowerShell側のモジュールが先に読み込まれてエラーになる事象が発生したためこれに対処するための対応となります。
Enable SecureString cmdlets for non-Windows by storing the plain text (#9199)
こちらは以前Developers.IOで触れた記事の内容となります。
Improve error message on non-Windows when importing clixml with securestring (#7997)
こちらは元のプルリクエスト(#7997)に記載されている通り、Import-Clixml
でSecureStringが含まれるCLIXMLを読み込んだ際のエラーメッセージをよりわかりやすくする改善となります。
Adding parameter ReplyTo to Send-MailMessage (#8727)
Send-MailMessage
コマンドレットに-ReplyTo
パラメーターが追加されました。
Add Obsolete message to Send-MailMessage (#9178)
素のSMTPによるメール送信はセキュリティ的によろしくないということでSend-MailMessage
は非推奨となりました。
こちらは元々.NET CoreでSmtpClient
の使用が非推奨になったことを受けての対応となります。(Send-MailMessage
は内部でSmtpClient
を使っています)
*DE0005: SmtpClient shouldn't be used
そして、まだプルリク内で議論中ですが以下のRFCで詳細を確認できます。
PowerShell Core 6.2ではSend-MailMessage
を利用すると以下の警告メッセージが表示される様になっています。
WARNING: The command 'Send-MailMessage' is obsolete. This cmdlet does not guarantee secure connections to SMTP servers. While there is no immediate replacement available in PowerShell, we recommend you do not use Send-MailMessage at this time. See https://aka.ms/SendMailMessage for more information.
Fix Restart-Computer to work on localhost when WinRM is not present (#9160)
WinPEといったWinRMサービスが存在しない環境でRestart-Computer
がエラーになるのが修正されています。
Make Start-Job throw terminating error when PowerShell is being hosted (#9128)
独自プログラム内でホストされているPowerShellからStart-Job
を呼び出すとエラーになるのが修正されています。
Add C# style type accelerators and suffixes for ushort, uint, ulong, and short literals (#7813)
ushort
、uint
、ulong
、short
型に対して以下の型アクセラレーターとサフィックスが追加されました。
型 | 型アクセラレーター | サフィックス |
---|---|---|
ushort | [ushort] | us |
uint | [uint] | u |
ulong | [ulong] | u |
short | [short] | s |
ドキュメントは以下で更新されています。
Correctly Report impact level when SupportsShouldProcess is not set to 'true' (#8209)
これまで各コマンドレットに設定されているConfirmImpact
がすべてMedium
となっておりあまり役に立たない現状を改善するため、SupportsShouldProcess = $false
となっているコマンドレットのConfirmImpact
をNone
にするのと、明らかに影響度の低いコマンドレットである
- New-PSDrive
- New-Alias
- New-TemporaryFile
- Update-TypeData
- Update-FormatData
- New-Variable
- ForEach-Object
- New-ModuleManifest
- Receive-PSSession
についてはConfirmImpact = Low
にする変更を加えています。
Fix Request Charset Issues in Web Cmdlets (#8742)
Invoke-RestMethod
などのWeb CmdletsにおいてContent Typeにキャラクタセット指定が含まれている場合に指定のキャラクタセットを反映させる様に修正が入っています。
Fix Expect 100-continue issue with Web Cmdlets (#8679)
Web CmdletsにおいてExcept
ヘッダが無効にされていたのが改善されています。
Fix file blocking issue with web cmdlets (#7676)
Web Cmdletsにおいてファイルをマルチパートアップロードしようとするとファイルのオープンエラーとなってしまう件に対応しています。
(単純にファイルを共有オープンすることで対処しています)
Fix code page parsing issue in Invoke-RestMethod (#8694)
この件の元となるIssue(#8510)は「Invoke-RestMethod
がエンコーディングがCP936の中国語サイトで動作しない」で、それに対処したとされているのですが、プルリクエストの内容を見る限りエラー時の詳細メッセージを表示する様にしただけで特に対処していない様に見受けられます...
Refactor ConvertTo-Json to expose JsonObject.ConvertToJson as a public API (#8682)
JSON Cmdlets内部で使われているJsonObject
のうちConvertFromJson
メソッドはPublicに公開されているもののConvertToJson
は非公開となっているのは不便だということでConvertToJson
メソッドも公開される様になりました。
Add configurable maximum depth in ConvertFrom-Json with -Depth (#8199)
ConvertFrom-Json
コマンドレットで対応可能なJSONのネストの深さは1024
固定だったのですが、この深さを-Depth
パラメーターで設定できる様になりました。
既定値は1024
です。
Add EscapeHandling parameter in ConvertTo-Json cmdlet (#7775)
ConvertTo-Json
で<
、>
、&
、'
、"
のエスケープが行われる様に改善されました。
これはWindows PowerShellでの挙動およびRFC 8259に合わせる変更となります。
Add -CustomPipeName to pwsh and Enter-PSHostProcess (#8889)
名前付きパイプを使って別のPowerShellプロセスに接続するために、pwsh(.exe)
の引数とEnter-PSHostProcess
にCustomPipeName
パラメーターが追加されました。
- 接続される側
# pwshの引数でcustompipenameを設定
pwsh -custompipename mypipe
- 接続する側
# Enter-PSHostProcessのCustomPipeNameパラメーターでパイプ名を指定
Enter-PSHostProcess -CustomPipeName mypipe
Enable creating relative symbolic links on Windows with New-Item (#8783)
New-Item
でシンボリックリンクを作る際に相対パスでの指定ができる様に修正がされています。
Allow Windows users in developer mode to create symlinks without elevation (#8534)
Windows環境においてWindows 10 Creators Update(Build 14972)以降であれば管理者権限無しでシンボリックリンクを作成できるのですが、これにPowerShell側が対応できていなかったのが改善されました。
Enable Write-Information to accept $null (#8774)
Write-Information
の引数に$null
が指定されてもエラーとならない様になりました。
Fix Get-Help for advanced functions with MAML help content (#8353)
MAMLで定義された高度な関数のヘルプが表示されない問題がこの対応により解消しています。
具体的にはMicrosoft.PowerShell.Archive
モジュールのヘルプ表示が改善されたそうです。
Fix Get-Help PSTypeName issue with -Parameter when only one parameter is declared (#8754)
Get-Help
で表示されるパラメーターの型の表示を改善した、そうなのですが、手元の環境で試した限りでは改善した様に見えませんでした...
Token calculation fix for Get-Help executed on ScriptBlock for comment help. (#8238)
スクリプトブロック、またはスクリプトブロック内で動的に作成された関数に対してヘルプ情報を取得できる改善がされています。
Change Get-Help cmdlet -Parameter parameter so it accepts string arrays (#8454)
Get-Help
の-Parameter
パラメーターが複数の文字列を受け取れる様に改善されました。
Get-Help -Name Get-Command -Parameter Verb, Noun
Resolve PAGER if its path contains spaces (#8571)
PAGER
環境変数にスペースが含まれる場合にヘルプのページングが正しく動作しない件が修正されています。
Add prompt to the use of less in the function 'help' to instruct user how to quit (#7998)
非Windows環境ではGet-Help
のページングにless
がデフォルトで使われるのですが、これまでは引数無しでless
が呼ばれていたものがless -Ps(後略)
と引数が付けられ終了方法を促すメッセージを表示する様に改善されています。
Add support enum and char types in Format-Hex cmdlet (#8191)
Format-Hex
でchar
とenum
がサポートされる様になりました。
Remove ShouldProcess from Format-Hex (#8178)
Format-Hex
がShouldProcess = false
に変更されました。
Add new Offset and Count parameters to Format-Hex and refactor the cmdlet (#7877)
Format-Hex
に-Offset
、-Count
パラメーターが追加されました。
Make scriptblock based calculated properties work again in ConvertTo-Html (#8427)
ConvertTo-Html
の-Property
パラメーターがSelect-Object
のそれの様にHashtableを引き受けることができる様に拡張されました。
Allow 'name' as an alias key for 'label' in ConvertTo-Html, allow the 'width' entry to be an integer (#8426)
前項の修正に加えて、name
をlabel
のエイリアスとする対応と、列幅をWidth
で指定できる様に機能拡張されています。
Add cmdlet Join-String for creating text from pipeline input (#7660)
文字列を結合するためのJoin-String
コマンドレットが追加されました。
詳細はドキュメントをご覧ください。
C:\> 1..3 | Join-String -OutputPrefix "A " -OutputSuffix " B" -Separator "," -SingleQuote
A '1','2','3' B
Change Clear-Host back to using $RAWUI and clear to work over remoting (#8609)
Clear-Host
コマンドレットが非Windows環境に対してリモート接続した際に正しく動作しない不具合が解消されています。
help function shouldn't use pager for AliasHelpInfo (#8552)
help
関数でエイリアス情報を表示する際に表示が崩れてしまう不具合が解消されています。
Add -UseMinimalHeader to Start-Transcript to minimize transcript header (#8402)
Start-Transcript
で作成されるテキストファイルのヘッダ情報を最小限にする-UseMinimalHeader
パラメーターが追加されました。
- 通常のTranscriptヘッダ
**********************
PowerShell transcript start
Start time: 20190423144037
Username: User01
RunAs User: User01
Configuration Name:
Machine: PC001 (Microsoft Windows NT 10.0.17763.0)
Host Application: C:\Program Files\PowerShell\6\pwsh.dll
Process ID: 17660
PSVersion: 6.1.3
PSEdition: Core
GitCommitId: 6.1.3
OS: Microsoft Windows 10.0.17763
Platform: Win32NT
PSCompatibleVersions: 1.0, 2.0, 3.0, 4.0, 5.0, 5.1.10032.0, 6.1.3
PSRemotingProtocolVersion: 2.3
SerializationVersion: 1.1.0.1
WSManStackVersion: 3.0
**********************
- -UseMinimalHeaderパラメーター使用時
**********************
PowerShell transcript start
Start time: 20190423144029
**********************
Expose all cmdlets from PSDiagnostics if logman.exe is available (#8366)
PSDiagnostics
モジュールのコマンドレットが正しく公開されていない不具合が解消されています。
Remove Persist parameter from New-PSDrive on non-Windows platform (#8291)
プラットフォームとして対応できないため、非Windows環境ではNew-PSDrive
の-Persist
パラメーターが削除されました。
Add support for cd + (#7206)
以前のバージョンでcd -
に対応したのに加えて、PowerShell Core 6.2ではcd +
にも対応しました。
Enable Set-Location -LiteralPath to work with folders named - and + (#8089)
前項でcd +
、cd -
に対応した件で、+
、-
という名称のフォルダが存在する場合に正しく動作しない不具合が解消されています。
Test-Path returns $false when given an empty or $null path value (#8080)
Test-Path ' '
といったスペースや空文字に対するTest-Path
が$true
を返してしまう挙動が改善されています。
Allow dynamic parameter to be returned even if path does not match any provider (#7957)
Get-Content C:\NonExistentWildcard*.txt -Raw
の様に-Raw
、-Delimiter
パラメーターを併用してワイルドカード指定でGet-Content
を呼び出し、該当ファイルが無い場合のエラーメッセージが不適切なのが解消されています。
Support Get-PSHostProcessInfo and Enter-PSHostProcess on Unix platforms (#8232)
Get-PSHostProcessInfo
とEnter-PSHostProcess
がLinuxおよびmacOSで使用できる様になっています。
LinuxおよびmacOSでも名前付きパイプを使い別PowerShellプロセスにアタッチする形となります。
Reduce allocations in Get-Content cmdlet (#8103)
Get-Content
の内部処理を見直しメモリ使用量を抑える修正が入っています。
具体的にどの程度改善されたか数値化はされていませんが、ざっくりSpan
を使う対応が入っているのと、コンテンツ内の文字検索にボイヤー-ムーア文字列検索アルゴリズムを採用する様になっておりそれなりの効果はあるのではないかと思われます。
Enable Add-Content to share read access with other tools while writing content (#8091)
Add-Content
でファイルを開く際のモードをFileShare.Write
からFileShare.ReadWrite
に変更し、他のプロセス(tail
など)がファイルを読み込んでいる最中にAdd-Content
を呼び出してもエラーとならない様に改善されています。
Get/Add-Content throws improved error when targeting a container (#7823)
ディレクトリに対してGet-Content
、Add-Content
を呼び出した際のエラーメッセージがよりわかりやすいものに改善されています。
Add -Name, -NoUserOverrides and -ListAvailable parameters to Get-Culture cmdlet (#7702)
Get-Culture
に-Name
、-NoUserOverrides
、-ListAvailable
パラメーターを追加されました。
Add unified attribute for completion for Encoding parameter. (#7732)
-Encoding
パラメーターを使うコマンドレットの-Encoding
パラメーターの記述を内部的に統一しています。
あくまで内部処理の変更で利用者には影響はありません。
Allow numeric Ids and name of registered code pages in Encoding parameters (#7636)
-Encoding
パラメーターを使うコマンドレットの-Encoding
パラメーターにコードページの値を指定できる様に機能が拡張されました。
# コードページの数値指定
Set-Content -Path .\test1.txt -Value "я" -Encoding 1251
# コードページ名での指定
Set-Content -Path .\test2.txt -Value "я" -Encoding "windows-1251"
Fix Rename-Item -Path with wildcard char (#7398)
ワイルドカード文字を含む名称に対するリネーム処理でエラーがでる場合があるのが改善されています。
When using Start-Transcript and file exists, empty file rather than deleting (#8131)
Start-Transcript
で既存のファイルを上書きする際にこれまでは既存のファイルを削除して新しいファイルを書き直す挙動だったが空文字列で上書きする様に内部処理が変更されています。
これは削除する際にアクセスエラーになる場合があるのに対処するための対応だそうです。
Make Add-Type open source files with FileAccess.Read and FileShare.Read explicitly (#7915)
Add-Type
でソースファイルを読み込む際に共有モードでファイルをオープンする様に改善されています。
Fix Enter-PSSession -ContainerId for the latest Windows (#7883)
Enter-PSSession -ContainerId $id
でコンテナにPowerShell Directに接続しようとするとエラーになる件が解消されています。
この件に関しては以前私の個人ブログで少し触れていますので以下の記事を参照してください。
Ensure NestedModules property gets populated by Test-ModuleManifest (#7859)
Test-ModuleManifest
でNestedMoudleの情報が正しく取れない不具合が解消されています。
Add %F case to Get-Date -UFormat (#7630)
Get-Date
の-UFormat
パラメーターの書式で%F
(%Y-%m-%d
と同等)が使える様になりました。
C:\> Get-Date -UFormat '%F'
2019-04-24
Fix Set-Service -Status Stopped to stop services with dependencies (#5525)
依存関係のあるサービスに対してSet-Service -Status Stopped
を呼び出してサービスを止めようとするとエラーになる不具合が解消されています。
最後に
以上です。
更新の多さもありますが、内容が整理されていないこともありとても疲れました...
英語は全然得意ではないのですがこれはちょっと元のドキュメントに対して改善のフィードバックを上げないとダメかなぁと考えています。